#include<bits/stdc++.h>
using namespace std;
typedef struct st ak;
const int N=1e+4+10;//因为1<n<100,所以1<m<100*(100-1)/2==4950;直接开1万(阔气)
int pre[N]={0};//并查集数组
struct st{
    int v1,v2,w;
    st()
    {
        v1=v2=w=0;
    }
}s[N];
int n;
int find(int x)
{//找祖先
    int t=x;
    while(pre[t]!=t)
    {
        t=pre[t];
    }
    return t;//返回祖先
}
int cmp(ak a,ak b)
{//sort排序条件
    return a.w<b.w;
}
int main()
{
    int num=0,sum=0;
    while(cin>>n&&n!=0)
    {
        num=0;
        sum=0;
        for(int i=1;i<=n;i++)
            pre[i]=i;

        int m=n*(n-1)/2;
        for(int i=1;i<=m;i++)
        {
            int t1,t2;
            int x,y,z,f;
            cin>>x>>y>>z>>f;
            if(f==1)//1表示该边已经建成了
            {//直接并查集走起
                t1=find(x);//找x的祖先
                t2=find(y);//找y的祖先
                pre[y]=t1;//y认x的祖先为自己的祖先
                pre[t2]=t1;//y的祖先认x的祖先为自己的祖先
                //x和x的祖先与y和y的祖先并入一个连通分量(生成树)
            }
            else//0表示该边还未建成,待选择
            {//
                s[num].v1=x,s[num].v2=y,s[num].w=z;
                num++;
            }
        }
        sort(s,s+num,cmp);//按权值从小到大排序
        for(int i=0;i<num;i++)//在剩下的边中选择
        {//并查集 和上面一样,直到所有结点都并入一个连通分量(生成树)中
            int t1,t2,x,y;
            x=s[i].v1,y=s[i].v2;
            t1=find(x);
            t2=find(y);
            if(t1!=t2)
            {
                pre[y]=t1;
                pre[t2]=t1;
                sum+=s[i].w;//记录生成树的权值
            }
        }
        cout<<sum<<endl;
    }
    return 0;
}


